package org.fastsyncer.sdk;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.http.message.BasicNameValuePair;
import org.fastsyncer.sdk.client.AbstractClient;
import org.fastsyncer.sdk.client.Driver;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/**
 * 通过HTTP协议实现远程操作fastsyncer
 * <pre>
 * 执行流程：
 * 1、发起认证
 * 2、获取token
 * 3、携带token操作
 * 4、token失效，重新认证
 * </pre>
 * 
 * @author AE86
 * @date 2018年9月21日 下午3:34:40
 * @version 1.0.0
 */
public final class Fastsyncer extends AbstractClient implements Driver {

	/**
	 * 请求参数
	 */
	private static final String PARAMS = "params";
	
    public Fastsyncer() {
    	super.init();
    }

    /**
     * 连接配置
     * @param ip
     * @param port
     * @param username 用户名
     * @param userpwd 密码
     */
    public Fastsyncer(String ip, int port, String username, String userpwd) {
    	if (StringUtils.isBlank(ip) || 0 == port || StringUtils.isBlank(username) || StringUtils.isBlank(userpwd)) {
			throw new IllegalArgumentException("配置信息不正确.");
		}
    	super.init(ip, port, username, userpwd);
    }

    @Override
	public String add(String mapping) {
		return callDriver("/api/add", mapping);
	}

	@Override
	public String update(String mapping) {
		return callDriver("/api/update", mapping);
	}

	@Override
	public String enable(String id) {
		return callDriver("/api/enable", id);
	}

	@Override
	public String disable(String id) {
		return callDriver("/api/disable", id);
	}

	@Override
	public String start(String id) {
		return callDriver("/api/start", id);
	}

	@Override
	public String stop(String id) {
		return callDriver("/api/stop", id);
	}

	@Override
	public String delete(String id) {
		return callDriver("/api/delete", id);
	}

	@Override
	public String getDriver(String id) {
		return callDriver("/api/getDriver", id);
	}

	@Override
	public List<String> getDriverAll() {
		String json = super.sendWithToken("/api/getDriverAll", null);
		if(StringUtils.isBlank(json)){
			return null;
		}
		List<String> res = null;
		try {
			JSONArray array = new JSONArray(json);
			int len = array.length();
			res = new ArrayList<>(len);
			JSONObject row = null;
			for (int i = 0; i < len; i++) {
				// 驱动配置
				row = array.getJSONObject(i);
				res.add(row.toString());
			}
		} catch (JSONException e) {
			e.printStackTrace();
		}
		return res;
	}

	private String callDriver(String url, String arg){
		List<BasicNameValuePair> list = new ArrayList<>();
		list.add(new BasicNameValuePair(PARAMS, arg));
		return super.sendWithToken(url, list);
	}
	
}
